﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;

namespace 学习三
{
    //public class fsa
    //{

    //    public class fsa2 // 定义一个类
    //    {
    //        public string name { get; set; }// 姓名
    //        public int age { get; set; }// 年龄
    //    }

    //    public static Dictionary<int, fsa2> dict = new Dictionary<int, fsa2>();// 定义一个字典，键为int类型，值为fsa2类型

    //    static void Main(string[] args)
    //    {
            
    //        dict.Add(0, new fsa2 { name = "张三", age = 30 });
    //        dict.Add(1, new fsa2 { name = "李四", age = 25 });
    //        dict = null; // 清空字典

    //        if (dict != null && dict.ContainsKey(1)) // 存在
    //        {
    //            dict[1] = new fsa2 { name = "李5",age =70 };// 修改字典中的值

    //        }
    //        if (dict != null) // 检查字典是否为空
    //        {
    //            foreach (var item in dict)
    //            {
    //                Console.WriteLine("序号:{0} 姓名:{1} 年龄：{2}", item.Key, item.Value.name, item.Value.age);
    //            }
    //        }
    //        else
    //        {
    //            Console.WriteLine("字典为空");
    //        }

    //            Console.ReadKey();
    //    }
    //}

    public class Myclass
    {

        private static readonly string jsonFilePath = "data.json"; // JSON文件路径
        private static readonly string jsonFilePath1 = "null_dict.json"; // JSON文件路径

        public static Dictionary<int, Dictionary<string, float>> dict = new Dictionary<int, Dictionary<string, float>>();

        public static List<int> null_序号dict = new List<int>();

        public int y= 0;

        public static void Main(string[] args)
        {
            Myclass d = new Myclass();

            初始化JSON文件();
            从JSON加载数据();
            // dict.Add(0, new Dictionary<string, float>() { { "张三", 30.5f }, { "里斯", 7f } });
            // dict.Add(1, new Dictionary<string, float>() { { "张三1", 30.5f },{"里斯1",7f } });


            // 确保字典不为空
            if (dict == null || dict.Count == 0)
            {
                dict = new Dictionary<int, Dictionary<string, float>>()
                {
                    { 0, new Dictionary<string, float>() { { "张三", 30.5f }, { "里斯", 7f } } },
                    { 1, new Dictionary<string, float>() { { "张三1", 30.5f }, { "里斯1", 7f } } }
                };
                保存到JSON();
                Console.WriteLine("字典为空，已初始化为默认值");
            }

            while (true)
            {
                保存到JSON();
                Console.WriteLine("1.便利字典 2.删除序号 3.清空里面的数 4.修改序号 5.退出 6.添加 7.查看存在序号的空值 8.重新对空序号字典赋值 9.排序");
                d.y = int.Parse(Console.ReadLine());
                if(d.y == 1)
                {
                    d.便利字典(dict);
                }
                if(d.y == 2)
                {
                    d.undo(ref dict);
                }
                if (d.y == 3)
                {
                    d.清空里面的数(ref dict);
                }
                if(d.y == 4)
                {
                    修改序号(ref dict);
                }
                if( d.y == 5)
                {
                    Environment.Exit(0);
                }
                if(d.y == 6)
                {
                    添加(ref dict);
                }
                if(d.y == 7)
                {
                    foreach (var item in null_序号dict)
                    {
                        Console.WriteLine("序号:{0} 值为null", item);
                    }
                }
                if(d.y == 8)
                {
                    重新对空序号字典赋值(ref dict);
                }
                if(d.y == 9)
                {
                    重新排序(ref dict);
                }
            }

        }

        //ai
        private static void 初始化JSON文件()
        {
            if (!File.Exists(jsonFilePath))
            {
                // 预设数据
                var 预设数据 = new Dictionary<int, Dictionary<string, float>>()
        {
            { 0, new Dictionary<string, float>() { { "张三", 30.5f }, { "里斯", 7f } } },
            { 1, new Dictionary<string, float>() { { "张三1", 30.5f }, { "里斯1", 7f } } }
        };

                string json = JsonConvert.SerializeObject(预设数据, Formatting.Indented);
                File.WriteAllText(jsonFilePath, json);
                Console.WriteLine("创建新的JSON文件，并写入预设数据");
            }
            if (!File.Exists(jsonFilePath1))
            {
                // 预设数据
                var le = new List<string>()
                {

                };

                string json1 = JsonConvert.SerializeObject(le, Formatting.Indented);
                File.WriteAllText(jsonFilePath1, json1);
                Console.WriteLine("创建新的JSON文件，并写入预设数据");
            }

        }

        private static void 从JSON加载数据()
        {
            try
            {
                string json = File.ReadAllText(jsonFilePath);
                dict = JsonConvert.DeserializeObject<Dictionary<int, Dictionary<string, float>>>(json);
                Console.WriteLine("从JSON文件加载数据成功");
                string json1 = File.ReadAllText(jsonFilePath1);
                null_序号dict = JsonConvert.DeserializeObject<List<int>>(json1);
                Console.WriteLine("从JSON文件加载null_序号dict成功");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"加载JSON文件失败: {ex.Message}");
                Console.WriteLine(ex.ToString());
                dict = new Dictionary<int, Dictionary<string, float>>(); // 创建空字典
            }
        }

        private static void 保存到JSON()
        {
            try
            {
                string json = JsonConvert.SerializeObject(dict, Formatting.Indented);
                File.WriteAllText(jsonFilePath, json);
                Console.WriteLine("数据已保存到JSON文件");
                string json1 = JsonConvert.SerializeObject(null_序号dict, Formatting.Indented);
                File.WriteAllText(jsonFilePath1, json1);
                Console.WriteLine("null_序号dict已保存到JSON文件");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"保存到JSON文件失败: {ex.Message}");
                Console.WriteLine(ex.ToString());
            }
        }
        //ai

        public void 便利字典(Dictionary<int,Dictionary<string, float>> dict)
        {
            if (dict != null || dict.Count > 0)
            {
                foreach (var item in dict)
                {
                    foreach (var item2 in item.Value)
                    {
                        Console.WriteLine("序号:{0} 姓名:{1} 年龄：{2}", item.Key, item2.Key, item2.Value);
                    }
                    Console.Write("\n");
                }
            }
            else { Console.WriteLine("字典为空"); }
        }


        public virtual void undo(ref Dictionary<int, Dictionary<string, float>> dict)
        {
            int? 序号 = null;
            Console.Write("删除操作 序号:");
            序号 =int.Parse(Console.ReadLine());// 输入序号
            foreach (var item in dict)
            {
                if (item.Key == 序号) dict[序号.Value].Clear();// 清空字典
            }
            dict.Remove(序号.Value);// 删除字典
            Console.WriteLine("删除成功");            
        }

        public virtual void 清空里面的数(ref Dictionary<int, Dictionary<string, float>> dict)
        {
            int? 序号 = null;
            Console.Write("清空里面的数 序号:");
            序号 = int.Parse(Console.ReadLine());// 输入序号
            if (dict != null && dict.Count > 0)
            {
                if (dict.ContainsKey(序号.Value))
                {
                    var keysToRemove = dict[序号.Value].Keys.ToList();
                    foreach (var key in keysToRemove)
                    {
                        dict[序号.Value].Remove(key);//清除字典里面的数
                    }

                    Console.WriteLine("清空序号的值{0}成功 此时值为null 但序号保留", 序号.Value);

                    foreach(var item1 in dict)
                    {
                        if (item1.Key == 序号.Value) null_序号dict.Add(item1.Key);
                    }
                }
                else
                {
                    Console.WriteLine("没有的序号");
                }
            }
            else
            {
                Console.WriteLine("字典为空");
            }
            Console.WriteLine("清空成功");
        }

        public static void 修改序号(ref Dictionary<int, Dictionary<string, float>> dict)
        {
            int 原序号 = 0, 新序号 = 0;
            Console.Write("请输入原序号:");
            原序号 = int.Parse(Console.ReadLine());// 输入原序号
            Console.Write("请输入新序号:");
            新序号 = int.Parse(Console.ReadLine());// 输入新序号

            if (dict != null && dict.ContainsKey(原序号) && dict.Count > 0)
            {
                Dictionary<string, float> temp = dict[原序号];// 临时变量
                dict.Remove(原序号);
                dict.Add(新序号, temp);
                Console.WriteLine("修改成功");
            }
            else
            {
                Console.WriteLine("序号不存在或字典为空");
            }
        }

        public static void 添加(ref Dictionary<int, Dictionary<string, float>> dict)
        {
            int 序号 = 0; bool tag = false;
            Console.Write("请输入序号:");
            序号 = int.Parse(Console.ReadLine());// 输入序号
            if (dict!=null&&dict.Count>0)
            {
                foreach (var item in dict)
                {
                    if (item.Key == 序号) { tag = false; break; }
                    else { tag = true; }
                }

                if (tag)
                {
                    string name1 = "";
                    float age1 = 0f;
                    Console.Write("请输入姓名:");
                    name1 = Console.ReadLine();
                    Console.Write("请输入年龄:");
                    age1 = float.Parse(Console.ReadLine());
                    try
                    {
                        dict.Add(序号, new Dictionary<string, float>() { { name1, age1 } });
                    }
                    catch (Exception ex)
                    {
                       Console.WriteLine(ex.Message);
                    }

                }
                else
                {
                    Console.WriteLine("序号已存在 请重新输入");
                }
            }
        }

        public static void 重新对空序号字典赋值(ref Dictionary<int, Dictionary<string, float>> dict)
        {
            int 序号 = 0; string name1 = ""; float age1 = 0f;
            Console.Write("请输入序号:");
            序号 = int.Parse(Console.ReadLine());// 输入序号
            Console.Write("请输入姓名:");
            name1 = Console.ReadLine();
            Console.Write("请输入年龄:");
            age1 = float.Parse(Console.ReadLine());

            if (dict != null && dict.Count > 0&& null_序号dict.Contains(序号))
            {
                if (dict.ContainsKey(序号))
                {
                    if (null_序号dict.Contains(序号))
                    {
                        dict[序号] = new Dictionary<string, float>() { {name1, age1 } };
                        null_序号dict.Remove(序号);
                    }
                    Console.WriteLine("重新赋值成功");
                }
                else
                {
                    Console.WriteLine("没有的序号");
                }
            }
            else if(!null_序号dict.Contains(序号))
            {
                Console.WriteLine("序号赋值了");
            }
            else if(dict == null)
            {
                Console.WriteLine("字典为空");
            }
            else
            {
                Console.WriteLine("序号不存在");
            }
        }

        public static void 重新排序(ref Dictionary<int, Dictionary<string, float>> dict)
        {
            if (dict != null && dict.Count > 0)
            {
                var temp = dict.OrderBy(x => x.Key).ToDictionary(x => x.Key, x => x.Value);// 
                dict = temp;
                Console.WriteLine("重新排序成功");
            }
            else
            {
                Console.WriteLine("字典为空");
            }
        }

    }

}
